package org.example.mapper;

import com.sun.istack.internal.Nullable;
import org.apache.ibatis.annotations.Param;
import org.example.pojo.FqmUser;
import org.example.pojo.FqmUserFlag;

import java.util.List;

public interface FqmUserMapper {
    List<FqmUser> queryAll();

    FqmUser queryFqmUserById(Integer id);

    List<FqmUser> queryFqmUserByName(String name);

    // 注意，对于多个参数：
    // 1. 要么设置参数类型为整个实体类比如，更新，插入等直接在xml上设置parameterType="fqmUser"即可
    // 2. 使用参数注解，指定参数的名字。这样即使顺序不一致，也可以精确定位
    // 这里我就故意把顺序设置为反向的
    List<FqmUser> queryFqmUserByNameOrAddress(@Nullable @Param("address") String address, @Nullable @Param("name") String name);

    // 以下代码会报错：、
    // ### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'name' not found. Available parameters are [arg1, arg0, param1, param2]
    // 也就是说，如果不在xml上设置parameterType="fqmUser"并且也不使用@param("name")指定参数，就只能使用默认的参数
    // 如果按下列语句定义接口方法，那么在xml对应的<select>标签里，应该这么实现：
    // <select id="queryFqmUserByNameOrAddress" resultType="fqmUser">
    //     select * from fqm_user where name = #{arg1} or address = #{arg0}
    // </select>
    // List<FqmUser> queryFqmUserByNameOrAddress(@Nullable  String address, @Nullable String name);

    // 下列语句对应使用arg1和arg0的xml方法
    // <select id="queryFqmUserByNameOrAddress" resultType="fqmUser">
    //     select * from fqm_user where name = #{arg1} or address = #{arg0}
    // </select>
    List<FqmUser> queryFqmUserByNameOrAddress_no_at_param(@Nullable String address, @Nullable String name);


    List<FqmUser> queryMutipart(FqmUserFlag fqmUserFlag);

    int updateFqmUser(FqmUser fqmUser);

    int insertFqmUser(FqmUser fqmUser);

    int deleteFqmUserById(Integer id);

    // 注意如果不用@param("ids")，那么在xml里，应该这么写：
    // <delete id="deleteFqmUserByIds">
    //     delete from fqm_user where id in
    //     <foreach collection="array" item="id" open="(" separator="," close=")">
    //         #{id}
    //     </foreach>
    // </delete>
    // int deleteFqmUserByIds(Integer[] ids);
    // 如果用@param("ids")，那么在xml里，应该这么写：
    // ...
    //     <foreach collection="ids" item="id" open="(" separator="," close=")">
    // ...
    int deleteFqmUserByIds(@Param("ids") Integer[] ids);

    int deleteFqmUserByName(String name);

    <T> int deleteFqmUserByIdOrName(T idOrName);
}
